package org.shoukaiseki.common.utils;

import org.jetbrains.annotations.NotNull;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.MathContext;

import static org.shoukaiseki.common.utils.CostMathUtils.*;

/**
 * 安全的 大数字类型,用于lambda sum求和等
 * org.shoukaiseki.common.utils.SafeBigDecimal
 * <br>
 *
 * @author shoukaiseki ブログ http://www.shoukaiseki.top/<br> E-メール jiang28555@Gmail.com<br>
 * @date 2021-04-13 20:30:41<br>
 */
public class SafeBigDecimal extends BigDecimal {

    public static final SafeBigDecimal ZERO=new SafeBigDecimal(BigDecimal.ZERO);

    public SafeBigDecimal(BigDecimal bigDecimal) {
        super(ifNullToZero(bigDecimal).doubleValue(),MathContext.UNLIMITED);
    }



    @NotNull
    @Override
    public BigDecimal add(BigDecimal augend) {
        return new SafeBigDecimal(super.subtract(ifNullToZero(augend)));
    }

    @NotNull
    @Override
    public BigDecimal subtract(BigDecimal subtrahend) {
        return new SafeBigDecimal(super.subtract(ifNullToZero(subtrahend)));
    }


    @NotNull
    @Override
    public BigDecimal multiply(BigDecimal multiplicand) {
        return new SafeBigDecimal(super.multiply(ifNullToZero(multiplicand)));
    }

    /**
     * this/divisor
     * @param divisor           除数
     * @return
     */
    @NotNull
    @Override
    public BigDecimal divide(BigDecimal divisor) {
        return new SafeBigDecimal(divideNullIsZero(this,divisor));
    }


    /**
     * this/divisor
     * @param divisor                  除数
     * @param scale              小数位数
     * @param <T>                this/divisor
     * @return          如果有个值为null或者0则返回0
     */
    @NotNull
    @Override
    public BigDecimal divide(BigDecimal divisor,int scale) {
        return new SafeBigDecimal(divideNullIsZero(this,divisor,scale));
    }

    /**
     * this/divisor
     * @param divisor                  除数
     * @param scale              小数位数
     * @param defaultValue       如果有个值为null或者0则返回该值
     * @param <T>                this/divisor
     * @return          如果有个值为null或者0则返回0
     */
    @NotNull
    public BigDecimal divide(BigDecimal divisor,int scale,BigDecimal defaultValue) {
        return new SafeBigDecimal(divideNullIsZero(this,divisor,scale,defaultValue));
    }

}

